"""
Seaborn 分面多变量探索示例

知识点：
1. 使用 PairGrid 创建成对关系图
2. 使用 relplot 进行多变量分面分析
3. 自定义分面图的每个子图
4. 探索性数据分析（EDA）最佳实践
"""

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 先设置 seaborn 主题
sns.set_theme(style="ticks")

# 然后强制设置中文字体（必须在 set_theme 之后）
plt.rcParams['font.sans-serif'] = ['PingFang HK', 'Hiragino Sans GB', 'STHeiti', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.family'] = 'sans-serif'

# 创建多变量数据集
np.random.seed(42)
n = 200
data = pd.DataFrame({
    '身高': np.random.normal(170, 10, n),
    '体重': np.random.normal(65, 12, n),
    '年龄': np.random.randint(20, 60, n),
    '收入': np.random.normal(8000, 2000, n),
    '性别': np.random.choice(['男', '女'], n),
    '教育': np.random.choice(['本科', '硕士', '博士'], n)
})

# 调整相关性
data['体重'] = data['身高'] * 0.5 + np.random.normal(0, 5, n)
data['收入'] = data['年龄'] * 200 + np.random.normal(0, 1000, n)

# 示例1: 使用 relplot 进行多维度探索
g1 = sns.relplot(
    data=data,
    x='身高',
    y='体重',
    hue='性别',
    size='年龄',
    col='教育',
    kind='scatter',
    height=4,
    aspect=1,
    sizes=(50, 300),
    alpha=0.7,
    palette='Set2'
)
g1.fig.suptitle('多变量分面探索：身高-体重关系', y=1.02, fontsize=14, fontweight='bold')
plt.savefig('/Users/binming/Desktop/CodeBase/python/Python语法/1-常用库/1-数据分析/Seaborn关系图示例/9-1-多变量分面.png', 
            dpi=300, bbox_inches='tight')
plt.show()

# 示例2: PairGrid 成对关系图
g2 = sns.PairGrid(data, hue='性别', vars=['身高', '体重', '年龄', '收入'])
g2.map_upper(sns.scatterplot, alpha=0.6)
g2.map_lower(sns.kdeplot)
g2.map_diag(sns.histplot, kde=True)
g2.add_legend()
g2.fig.suptitle('成对关系矩阵图', y=1.01, fontsize=14, fontweight='bold')
plt.savefig('/Users/binming/Desktop/CodeBase/python/Python语法/1-常用库/1-数据分析/Seaborn关系图示例/9-2-成对关系.png', 
            dpi=300, bbox_inches='tight')
plt.show()

print("分面多变量探索完成！")
print(f"数据集大小: {len(data)} 行")
print(f"变量数量: {len(data.columns)} 个")
